Embedded systems are in widespread use, for example in consumer electronics (televisions, mobile phones, microwaves, cameras, etc.), cars, industrial robots and telecommunication systems. Embedded systems are made up of a combination of special-purpose hardware and software, designed to function optimally for the desired purpose. They differ from personal computer systems because the hardware and software is specifically designed for a limited number of functions, and the system must meet several constraints, for example on response time, power consumption, cost, size, weight or form factor.
The use of embedded systems is growing rapidly, as is their complexity. The design of embedded systems therefore is receiving increased attention, in particular with regards to performance and stability of the systems. An important aspect of embedded system design is determining which parts to implement in which processor to allow parallel execution, in which the processors are programmable RISC or DSP type processors and/or dedicated accelerators. Traditionally, this determination is almost entirely done manually, which is very time consuming. Therefore, only few partitioning options can be explored. As a result it is hard to guarantee that an optimal solution has been created that optimally satisfies the design constraints.
Partially automated techniques for creating multi-processor systems do exist but have significant constraints. One constraint in particular is that most of these techniques require the use of a domain-specific language for which the tools can easier identify opportunities for parallelism. An example is the use of CleanC to limit the programming constructs and control flow to constructs that can be statically analyzed. Similarly, design tools based on SystemC force the user to manually rewrite the functional specification into a parallel description, where the design tool only implements low-level mapping of the parallel SystemC modules to actual processors.
Such restrictions hamper the reuse of existing code. Such code has to be rewritten to conform to the limitations of the chosen language, which may not even be possible in all cases. The resulting code in addition is specific to a certain hardware platform or configuration.
What is desired is a tool that can address the problem of transforming arbitrary software source code into an improved partitioning to multiple processors.